'use strict';
/* 
  流模式上传文件，需要配置multipart: { mode: 'strream' };才能生效；
 */

const { Controller } = require('egg');
const path = require('path');
const fs = require('fs');
const sendToWormhole = require('stream-wormhole');
// 使用流模式上传文件，要求仅支持上传一个文件的情况
// 且因为表单解析是有时序，因此要求前端代码中文件的fileds必须在最后面，否则、
// 拿到文件流的时候，stream.fields还没有解析完成，导致部分表单数据丢失；
class UploadStreamController extends Controller {

  async uploadFileStream() {
    const { ctx } = this;
    const stream = await ctx.getFileStream();
    const savename = path.basename(stream.filename);
    let buf;
    try {
      const parts = await toArray(stream);
      buf = Buffer.concat(parts);
    } catch (err) {
      await sendToWormhole(stream);
      throw err;
    }

    const savePath = path.join(__dirname, '../public/upload/');
    const savePathAbsolute = savePath + `${stream.filename}`;
    await fs.writeFile(savePathAbsolute, buf);
    ctx.helper.renderSuccess(ctx, { data: JSON.stringify(savePathAbsolute) });
  }
}

module.exports = UploadStreamController;
